//
//  GCD.h
//  面试题
//
//  Created by Toj on 8/23/21.
//

#pragma mark - 好处
GCD 利用CPU多核并行运算
GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程)

#pragma mark - 使用方法

dispatch_sync: 创建同步线程
dispatch_async: 创建异步线程

queue:
1. 主队列: dispatch_get_main_queue
2. 串行队列:
dispatch_queue_create(chat *, DISPATCH_QUEUE_SERIAL)
dispatch_queue_create(chat *, null)
3. 并发(并行)队列:
dispatch_queue_create(chat *, DISPATCH_QUEUE_CONCURRENT)
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY, 0)
DISPATCH_QUEUE_PRIORITY: 优先级
0: 保留字段

dispatch_after: 延迟执行任务
{
    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2*NSEC_PER_SEC));
    dispatch_after(time, dispatch_get_main_queue(), ^ {
        NSLog(@"This is my %d number!%@",i,[NSThread currentThread]);
    });
}

dispatch_set_target_queue(queue, queue2): 更改queue的优先级
第一个参数：指定要变更优先级的队列(要更改队列)
第二个参数：指定第一个参数（队列）要和我们预期队列执行相同优先级的队列(目标队列)

1. 可以利用串行队列实现, 先串行后并发的操作

Group: 组
dispatch_group_create(): 创建组
dispatch_group_asycn(): 执行任务

dispatch_group_enter
dispatch_group_leave
2个配对使用, 否则就造成死锁情况

dispatch_group_wait: 堵塞当前线程
dispatch_group_notify(): 组的回调


Dispatch_barrier_async: 栅栏任务

dispatch_apply: 循环任务

dispatch_suspend: 队列的挂起

dispatch_resume: 队列的唤醒

Semaphore: 信号量
dispatch_semaphore_create: 创建信号量, 多线程并发建议默认0
dispatch_time 超时时间
dispatch_semaphore_signal 信号+1操作
dispatch_semaphore_wait 信号-1操作 等待超时时间内完成, 如果传入0继续等待
